﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.ComponentModel;

namespace CBE.Model
{
    public partial class Ventas : IDataErrorInfo
    {

        Decimal _pago;
        public Decimal Pago
        {
            get { return _pago; }
            set
            {
                _pago = value;

                if (Importe.HasValue)
                {
                    Vuelto = value - Importe.Value;
                }
                else
                {
                    Vuelto = null;
                }
            }
        }

        public Ventas()
            : base()
        {
            this.ID_Venta = Guid.NewGuid();
            this.FechaVenta = DateTime.Now.Date;
            this.Activo = true;

            this.ServiciosVenta.AssociationChanged += new CollectionChangeEventHandler(ServiciosVenta_AssociationChanged);
            this.ProductosVenta.AssociationChanged += new CollectionChangeEventHandler(ProductosVenta_AssociationChanged);
            this.Promociones.AssociationChanged += new CollectionChangeEventHandler(Promociones_AssociationChanged);
        }

        void Promociones_AssociationChanged(object sender, CollectionChangeEventArgs e)
        {
            this.RecalcularImporteTotal();
        }

        void ProductosVenta_AssociationChanged(object sender, CollectionChangeEventArgs e)
        {
            this.RecalcularImporteTotal();
        }

        void ServiciosVenta_AssociationChanged(object sender, CollectionChangeEventArgs e)
        {
            this.RecalcularImporteTotal();
        }


        private void RecalcularImportePromociones()
        {
            decimal importebonificado = 0M;

            foreach (var item in this.Promociones)
            {
                var serviciosRelacionados = this.ServiciosVenta.
                    Where(sv => item.Servicios.Any(sp => sp.ID_Servicio == sv.Servicios.ID_Servicio));

                var importeServicioPromocion = serviciosRelacionados.Sum(sv => sv.ImporteServicio.HasValue ? sv.ImporteServicio.Value : 0);

                var coeficientePromocion = item.Bonificacion.HasValue ? (item.Bonificacion.Value / 100) : 0;

                importebonificado += importeServicioPromocion * coeficientePromocion;

            }

            this.ImporteBonificado = importebonificado;

        }

        private void RecalcularImporteServicios()
        {
            this.ImporteServicios = this.ServiciosVenta.Sum(serv => serv.ImporteServicio);
        }

        private void RecalcularImporteProductos()
        {
            this.ImporteProductos = this.ProductosVenta.Sum(pr => pr.Importe);
        }

        private void RecalcularImporteTotal()
        {
            this.RecalcularImporteServicios();

            this.RecalcularImportePromociones();

            this.RecalcularImporteProductos();

            this.Importe = this.ImporteServicios - this.ImporteBonificado + this.ImporteProductos;
        }


        #region IDataErrorInfo Members

        public string Error
        {
            get { throw new NotImplementedException(); }
        }

        public string this[string columnName]
        {
            get
            {
                String error = null;

                if (columnName == "Clientes" && Clientes == null)
                {
                    error = "El campo Cliente es de ingreso obligatorio.";
                }
                if (columnName == "FormaPago" && FormaPago == null)
                {
                    error = "El campo Forma de Pago es de ingreso obligatorio.";
                }
                if (columnName == "NumeroCupon" && FormaPago != null && !FormaPago.EsFormaPagoEfectivo && String.IsNullOrEmpty(NumeroCupon))
                {
                    error = "El campo Número de Cupón es de ingreso obligatorio.";
                }
                else if (columnName == "ServiciosVenta" && ServiciosVenta.Count == 0)
                {
                    error = "Debe ingresar al menos un Servicio relacionado con la Venta.";
                }
                else if (columnName == "Fecha" && this.FechaVenta == DateTime.MinValue)
                {
                    error = "El campo Fecha es de ingreso obligatorio.";
                }
                else if (columnName == "Importe")
                {
                    if (!Importe.HasValue)
                    {
                        error = "El campo Importe es de ingreso obligatorio.";
                    }
                    else if (Importe.Value <= 0)
                    {
                        error = "El campo Importe debe ser mayor que 0.";
                    }
                }

                return error;
            }
        }

        #endregion
    }
}
